#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QSerialPort>
#include <QSerialPortInfo>
#include <QStatusBar>
#include <QDebug>
#include <QIcon>
#include <QDateTime>
#include <QFileDialog>
#include <QFile>
#include <QTextStream>
#include <QMessageBox>
#include <QTimer>

QT_BEGIN_NAMESPACE
namespace Ui {
class MainWindow;
}
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private:
    void initMainWindow();                  // 初始化界面
    void initSignalSlot();                  // 初始化信号槽

private slots:
    void onConnectButtonClicked();          // 连接按钮槽函数
    void onReadButtonClicked();             // 读取按钮槽函数
    void onWriteButtonClicked();            // 写入按钮槽函数
    void onDeleteButtonClicked();           // 清空按钮槽函数
    void onExportButtonClicked();           // 导出按钮槽函数
    void onSerialDataReady();               // 串口数据就绪处理函数
    void handleSerialError(QSerialPort::SerialPortError error); // 处理串口错误槽函数

private:
    Ui::MainWindow *ui_;
    QSerialPort *serialPort_;
    bool isConnected_ = false;               // 连接状态标志
    int expectedCoilCount_ = 0;              // 记录请求的实际线圈数量
    QTimer *timeoutTimer_;                   // 超时定时器
    int currentRetryCount_ = 0;              // 当前重发次数
    QByteArray lastRequestFrame_;            // 上一次请求帧
    bool waitingResponse_ = false;           // 是否正在等待响应
    QByteArray responseBuffer_;              // 缓存串口接收的数据

    void autoFillSerialPorts();             // 扫描串口的函数
    QByteArray calculateCrc(const QByteArray &data);  // CRC校验
    QByteArray buildModbusRequest();        // 构建Modbus请求帧
    void parseModbusResponse(const QByteArray &response);  // 解析Modbus响应
    void startTimeoutMonitoring();          // 启动超时定时器
    void handleTimeout();                   // 超时处理函数
    void setRequestButtonsEnabled(bool enabled);  // 控制读写按钮可用性
};
#endif // MAINWINDOW_H
